package com.fabiodocarmo.calendario.actions;

import java.util.Calendar;
import java.util.Date;

import org.apache.log4j.Logger;

import com.fabiodocarmo.calendario.beans.DetalheNaoRepetivel;
import com.fabiodocarmo.calendario.beans.DetalheNaoRepetivelPk;
import com.fabiodocarmo.calendario.beans.DetalheRepetivel;
import com.fabiodocarmo.calendario.beans.DetalheRepetivelPk;
import com.fabiodocarmo.calendario.beans.Dia;
import com.fabiodocarmo.calendario.bo.CalendarioException;

/**
 * Classe action para a apresentação do calendário.
 *
 * @author Taciano Morais Silva - tacianosilva@gmail.com
 * @version 04/03/2009, 18h02m
 * @since 04/03/2009, 18h02m
 */
public class CalendarioAction extends AbstractAction {

	/**
	 * serialVersionUID.
	 */
	private static final long serialVersionUID = -5649423155323023598L;

	private Logger logger = Logger.getLogger(CalendarioAction.class);

	private Dia dia;
	private Date data;
	private DetalheRepetivel detalheRepetivel;
	private DetalheNaoRepetivel detalheNaoRepetivel;

	/**
	 * Resultado para a solicitação de inclusão.
	 */
	public static final String SOLICITAR_INCLUSAO = "solicitarInclusao";

	/**
	 * Resultado para a solicitação de alteração.
	 */
	public static final String SOLICITAR_ALTERACAO = "solicitarAlteracao";

	public String execute() {
		setData(new Date());
		setDia(new Dia());

		try {
			setDetalheRepetivel(getCalendario().buscarDetalheRepetivel(
					dia.getDiaDoMes(), dia.getMes()));
			setDetalheNaoRepetivel(getCalendario().buscarDetalheNaoRepetivel(
					dia.getDiaDoMes(), dia.getMes(), dia.getAno()));
		} catch (CalendarioException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return SUCCESS;
	}

	public String resumoAno() {
		this.dia = new Dia(data);

		try {
			setDetalheRepetivel(getCalendario().buscarDetalheRepetivel(
					dia.getDiaDoMes(), dia.getMes()));
			setDetalheNaoRepetivel(getCalendario().buscarDetalheNaoRepetivel(
					dia.getDiaDoMes(), dia.getMes(), dia.getAno()));
		} catch (CalendarioException e) {

			e.printStackTrace();
		}
		return "resumo";
	}

	public String solicitarAlteracao() throws Exception {
		logger.info("solicitarAlteracao()");
		this.dia = new Dia(data);
		setDetalheRepetivel(getCalendario().buscarDetalheRepetivel(
				dia.getDiaDoMes(), dia.getMes()));
		setDetalheNaoRepetivel(getCalendario().buscarDetalheNaoRepetivel(
				dia.getDiaDoMes(), dia.getMes(), dia.getAno()));

		return SOLICITAR_ALTERACAO;
	}

	/**
	 * Realiza a alteração e carrega a lista de usuários do sistema.
	 *
	 * @see com.opensymphony.xwork2.ActionSupport#execute()
	 */
	public String alterar() throws Exception {
        try {
            logger.info("alterar()");
            this.dia = new Dia(data);
            getDetalheRepetivel().setPk(new DetalheRepetivelPk(dia.getDiaDoMes(), dia.getMes()));
            getDetalheNaoRepetivel().setPk(new DetalheNaoRepetivelPk(dia.getDiaDoMes(), dia.getMes(), dia.getAno()));
            getCalendario().alterarDetalheRepetivel(getDetalheRepetivel());
            getCalendario().alterarDetalheNaoRepetivel(getDetalheNaoRepetivel());
            setDetalheRepetivel(null);
            setDetalheNaoRepetivel(null);
            return execute();
        } catch (CalendarioException ex) {
            logger.error(ex.getMessage(), ex);
            addActionError(getText(ex.getMessage(), ex.getParametros()));
            return SOLICITAR_ALTERACAO;
        }
    }

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public Dia getDia() {
		return dia;
	}

	public void setDia(Dia dia) {
		this.dia = dia;
	}

	public String getNomeDiaDaSemana() {
		switch (getDia().getDiaDaSemana()) {
		case Calendar.SUNDAY:
			return "Domingo";
		case Calendar.MONDAY:
			return "Segunda-feira";
		case Calendar.TUESDAY:
			return "Terça-feira";
		case Calendar.WEDNESDAY:
			return "Quarta-feira";
		case Calendar.THURSDAY:
			return "Quinta-feira";
		case Calendar.FRIDAY:
			return "Sexta-feira";
		case Calendar.SATURDAY:
			return "Sábado";
		default:
			return "Não é dia de semana!!!";
		}
	}

	public void setDetalheRepetivel(DetalheRepetivel detalheRepetivel) {
		this.detalheRepetivel = detalheRepetivel;
	}

	public void setDetalheNaoRepetivel(DetalheNaoRepetivel detalheNaoRepetivel) {
		this.detalheNaoRepetivel = detalheNaoRepetivel;

	}

	public DetalheRepetivel getDetalheRepetivel() {
		return detalheRepetivel;
	}

	public DetalheNaoRepetivel getDetalheNaoRepetivel() {
		return detalheNaoRepetivel;
	}

}
